Early versions of the HyperText Transport Protocol (HTTP) allowed only one request between computing devices to be outstanding at any one time on a given transport control protocol (TCP) connection: specifically, a response needed to be received for any request, prior to sending a subsequent request. For basic systems and web pages, this was adequate, but as the web grew in complexity with pages having embedded graphics, videos, scripts, interactive content, and other elements, requiring each request to be fulfilled prior to submitting a next request was a cause of significant delays. To address this, most web browsers or other applications would open a plurality of transport layer connections so as to transmit a plurality of concurrent HTTP requests. However, this consumes a large amount of client and server resources (e.g. TCP sockets, transmission and receive buffer memory, etc.), as well as greatly increasing overhead and reducing network efficiency. For example, if a client device opens ten TCP connections in order to transmit ten concurrent requests, the three-way handshaking procedure required for each connection results in thirty back-and-forth synchronization transactions separate from the requests for the desired data.
HTTP version 2 addresses these issues by providing application layer multiplexing within a single TCP connection, reducing the amount of transport layer overhead required for communicating multiple application layer requests and responses and reducing latencies associated with the handshaking procedure. However, due to TCP congestion avoidance algorithms such as the slow start algorithm, when these multiple application layer streams are multiplexed within the single TCP connection, the resulting congestion window for the connection grows significantly slower compared to a net congestion window for a corresponding multiple number of TCP connections each carrying a single application layer stream. In case of packet loss, congestion window reduction differences can result in a significant performance impact, greatly reducing data throughput between the devices, and negatively affecting quality of experience (QoE) for users.